안전하지 않은 로깅 메커니즘
안전하지 않은 로깅 메커니즘이란?
로킹이란 서비스들의 실행 상태, 사용자의 행위 등을 파일 또는 출력을 통해 남기는 행동을 말한다.
로그는 대부분 서비스들의 오작동이나, 정보유출 침해 사고가 발생하였을 때 경위 파악을 위해 사용된다.
안전하지 않은 로깅 메커니즘 취약점은 민감한 데이터나 노출이 되면 안되는 정보가 로그에 남아 있을 경우 발생하는 취약점이다.
취약점 진단
안드로이드 로깅 시스템은 아래와 같이 이루어져 있다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2Faf0b7787-3fd8-4290-8350-c25937275498%2FUntitled.png?table=block&id=400ca066-e3b7-4db1-8640-45cd98a3ca85&cache=v2)
커널 공간에서는 main, radio, event, system이라는 네 가지 동류의 버퍼를 관리하고 있다.
앱들은 보안정책으로 인해 커널의 버퍼에 접근이 불가능하기 때문에 /dev 디렉토리에 로그들이 저장된다.
저장되는 로그들의 정보와 종류는 다음과 같다.
로그 | 설명 |
Main | 메인 앱 로그로서 앱이나 플랫폼 내부에서 android.util.Log 클래스로 기록된 로그 |
Event | 시스템에서 발생하는 이벤트 정보를 위한 로그 |
Radio | 이동통신망과관련된 이벤트 정보 |
system | 안드로이드 플랫폼 내부의 하위 레벨에 있는 시스템이나 디버깅을 위한 로그 |
liblog는 네이티브 라이브러리에서 디바이스 노드를 읽고 쓸 수 있도록 API를 제공하고 있다.
C로 작성된 네이티브 애플리케이션 혹은 라이브러리에서 사용된다. 애플리케이션들은 로그 시스템에 직접 접근이 불가능하여 android.util.Log, android.util.EventLog 및 android.util.Slog 클래스를 통해 사용할 수 있다.
안드로이드 로그에는 5개의 static 메서드가 있고, 로그의 동급을 나타내어 준다. 개발자는 상황에 맞게 설정하여 사용할 수 있다.
등급 | 설명 |
V(Verbose) | 별로 중요하지 않은 정보 |
I(Info) | 일반 정보 |
D(Debug) | 디버그 관련 경고 |
W(Warning) | 경고 정보 로그 |
E(Error) | 에러 로그 |
F(Fatal) | 중요한 정보 |
S(Slient) | 가장 높은 우선순위로 다른 로그들은 출력되지 않음 |
adb를 통해 log를 확인 할 땐 logcat을 이용한다.
특정 등급의 로그를 조회를 할 땐 아래와 같이 조회하면 된다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2Fb0b3dd68-e11a-49c2-b4a9-e20f51d5e4ac%2FUntitled.png?table=block&id=347a2c0b-e8c2-4213-b1e5-08aa63b6575c&cache=v2)
추가적으로 logcat은 다양한 옵션을 제공하는데 옵션은 아래와 같다.
옵션 | 설명 |
-c | 모든 로그를 지운 후 종료 |
-d | 저장된 로그를 화면에 덤프하고 종료 |
-f <파일이름> | 로그를 지정한 파일 이름으로 저장하고, 파일 이름을 지정하지 않을 경우 표준 출력 |
-g | 로그 버퍼의 크기를 출력하고 종료 |
-b <버퍼명> | Main/radio/event 버퍼 중에서 원하는 것을 선택 |
-r <kbytes> | 지정한 용량 만큼의 로그 파일을 생성
기본 값은 16kbytes이며, -f 옵션이 필요 |
-s | 기본 필터 조건을 silent 등급으로 지정 |
-v 포멧 | 사용자가 출력할 로그의 포맷을 지정
포멧의 종류는 brief, process, tag, thread, raw, time, threadtime, long |
ADB에서 logcat을 통해 살펴 본 결과 InsecureBank에서 로그인과 비밀번호 변경, 계좌이체를 요청 할 시 관련 중요 데이터가 로깅되는 것을 볼 수 있다.
![비밀번호 변경 시 생기는 로그](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2F8b6f6712-11e6-4c87-b094-8d78ae459561%2FUntitled.png?table=block&id=fdaf8013-3e76-4ff2-a778-0430a5024c8c&cache=v2)
대응방안
해당 취약점은 개발 단계에서 발생하는데 DoLogin.class를 살펴보면 로그인 성공 시 아이디와 패스워드를 로깅하는 것을 볼 수 있다. 따라서 개발 당시 중요 정보는 로깅하지 않는 것이 중요하다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2Fa085f41a-cc9c-4094-83be-7288c63433d0%2FUntitled.png?table=block&id=75d1d033-d20b-4f64-845a-6c4f2b187b14&cache=v2)